#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;

class String{
	private:
		char* _str;
	public:
		// String类构造函数，传入一个字符串，开辟对应大小的空间，利用strcpy进行构造
		String(const char* str = "")
			: _str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}

		// String类拷贝构造函数
		// 深拷贝
		String(const String& s)
			: _str(new char[strlen(s._str) + 1])
		{
			strcpy(_str, s._str);
		}

		// 赋值操作符重载，深拷贝赋值
		String& operator=(const String& s)
		{
			if(this != &s) {
				//临时空间
				char* temp = new char[strlen(s._str) + 1];
				//先将内容拷贝到临时空间
				strcpy(temp, s._str);
				//释放_str原有空间
				delete[] _str;
				//_str指向这个临时空间
				_str = temp;

				return *this;
			}
			return *this;
		}

		const char* c_str()
		{
			return _str;
		}

		friend ostream& operator<<(ostream& _cout, const String& s);

		~String()
		{
			if(_str) {	
				delete[] _str;
			}
			_str = NULL;
		}
};

ostream& operator<<(ostream& _cout, const String& s)
{
	cout << s._str << endl;
	return _cout;
}

void TestString()
{
	String s1("Hello World!");
	cout << s1;

	String s2("Hello Bit!");
	cout << s2;
	s2 = s1;
	cout << s2;
}

int main()
{
	TestString();
	return 0;
}
